package com.lingqi.commands;

import com.lingqi.util.DBUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

// 上架命令 by 管理员
public class PutAwayCommand {
    public static void main(String[] args) throws SQLException {
        // 1. 由于我们的设计中，只有一个唯一的管理员，所以不需要登录

        // 2. 从用户那里读取我们需要的必要信息
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入书名：");
        String name = scanner.nextLine();
        System.out.print("请输入数目：");
        int count = scanner.nextInt();

        System.out.println("DEBUG:用户输入的书名 = " + name);
        System.out.println("DEBUG:用户输入的数目 = " + count);

        // 3. 通过 SQL 表现我们的上架后数据的变化（books 表）
        // 3.0 通过 select where name = ?
        Integer bid = null; // 之所以用包装类，是因为赋值 null，作为特殊值
        try (Connection c = DBUtil.connection()) {
            String sql = "select bid from books where name = ?";
            try (PreparedStatement ps = c.prepareStatement(sql)) {
                // 为动态 SQL 中的占位符绑定真实的数据
                ps.setString(1, name);

                System.out.println("DEBUG:执行 SQL = " + ps);

                // 带有结果的 sql 语句，所以使用 execute query 操作
                try (ResultSet rs = ps.executeQuery()) {
                    // 由于我们的结果只可能是 1 行 或者是 0 行
                    if (rs.next()) {
                        // 是有 1 行结果的
                        //  bid = rs.getInt(1);
                        bid = rs.getInt("bid");
                    }
                }
            }
        }

        System.out.println("DEBUG: 查询到的 bid = " + bid);
        if (bid != null) {
            // 3.1 如果图书馆里已经有这本书了，则执行 update
            // bid != null 的情况
            try (Connection c = DBUtil.connection()) {
                String sql = "update books set count = count + ?, total = total + ? where bid = ? ";
                try (PreparedStatement ps = c.prepareStatement(sql)) {
                    // 动态 SQL 中有 3 个问号，所以要绑定 3 次
                    ps.setInt(1, count);
                    ps.setInt(2, count);
                    ps.setInt(3, bid);

                    System.out.println("DEBUG: 执行 SQL = " + ps);

                    ps.executeUpdate();// update 语句是没有结果的，所以使用 execute update

                }
            }
        } else {
            // 3.2 如果图书馆没有这本书，则需要 insert
            // bid == null
            try (Connection c = DBUtil.connection()) {
                String sql = "insert into books (name, count, total) values (?, ?, ?)";
                try (PreparedStatement ps = c.prepareStatement(sql)) {
                    // 动态 SQL 中有 3 个问号，所以要绑定 3 次
                    ps.setString(1, name);
                    ps.setInt(2, count);
                    ps.setInt(3, count);

                    System.out.println("DEBUG: 执行 SQL = " + ps);    // 绑定之后，execute 之前

                    ps.executeUpdate();     // update 语句是没有结果的，所以使用 execute update

                }
            }
        }
        System.out.println("上架成功");
    }
}
